
import { isObject, isArray, isNull } from 'lodash-es'

// 样式keys类型，不需要检测升级
const cssKeys = ['classname', 'default', 'focus', 'hover']

// 静态配置key(二层)，需要检测升级
const StaticKey = 'base'

/**
 * 
 * @param {*} templateData 模板数据
 * @param {*} defaultData 默认数据
 */
export default function versionCheckAndUpdate(templateData, defaultData) {

  // 默认版本号
  let defaultVersion = defaultData.version

  // 模板数据
  let templateVersion = templateData.version

  // 版本不同，合并两个数据
  if (!templateVersion || templateVersion !== defaultVersion) {

    // 更新版本号
    templateData.version = defaultData.version

    // 升级数据
    mergeData(templateData, defaultData)
  }

}

/**
 * @description 合并数据，模板数据里的没有字段，填充上去
 * 数据格式：默认只有两层嵌套
 * @param {*} templateData 
 * @param {*} defaultData 
 */
function mergeData(templateData, defaultData) {

  // 功能块blockKeys 商品功能块templateKeys
  let { blockKeys = [] } = defaultData

  for (const key in defaultData) {

    let tem_value1 = templateData[key]
    let def_value1 = defaultData[key]

    // 处理第一层
    // 1. 模板无值，没有的字段，补充上去
    if (tem_value1 === undefined) {

      templateData[key] = def_value1
      continue
    }


    // 2. 功能块和base，进行第二层判断
    if (key == 'base' || blockKeys.includes(key)) {

      for (const key2 in def_value1) {
        let tem_value2 = tem_value1[key2]
        let def_value2 = def_value1[key2]

        // 2.1 模板无值，没有的字段，补充上去
        if (tem_value2 === undefined) {
          tem_value1[key2] = def_value2
          continue
        }

        // 3. 功能块的base属性，进行第三层判断
        if (key2 == 'base') {
          for (const key3 in def_value2) {
            let tem_value3 = tem_value2[key3]
            let def_value3 = def_value2[key3]

            // 3.1 模板无值，没有的字段，补充上去
            if (tem_value3 === undefined) {
              tem_value2[key3] = def_value3
            }
          }
        }
      }

    }
  }
}

// TODO: 判断有异常
// 两个数据是不同类型
function isDiffType(value1, value2) {

  // typeof判断基础类型
  if (typeof value1 !== typeof value2) {
    return true
  }

  // 继续判断细分对象： null, array, object
  if (isObject(value1) && !isObject(value2)) {
    return true
  }

  if (isArray(value1) && !isArray(value2)) {
    return true
  }

  if (isNull(value1) && !isNull(value2)) {
    return true
  }

  return false
}